package com.xiaoa.gossip.cluster.command;

import lombok.Data;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 通信 ping 包
 *
 * @author luokaichuang
 * @time 2020/5/7
 */
@Data
public class PingCommand {

    // 消息总长度
    private Integer totlen;

    // 协议版本
    private Double ver;

    private String id;

    // 当前数据版本
    private Long dataVersion;

    // 包类型
    public static final int CLUSTERMSG_TYPE_PING = 0; // ping
    public static final int CLUSTERMSG_TYPE_PONG = 1; // PONG
    public static final int CLUSTERMSG_TYPE_MEET = 2; // MEET
    public static final int CLUSTERMSG_TYPE_FALL = 3; // FALL
    public static final int CLUSTERMSG_TYPE_PULISTH = 4; // PULISTH
    public static final int CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST = 5; // failover 授权请求包
    public static final int CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK = 6; // failover 授权确认包
    public static final int CLUSTERMSG_TYPE_UPDATE = 7; // failover 授权确认包
    public static final int CLUSTERMSG_TYPE_MFSTART = 8; // 手动failover包
    public static final int CLUSTERMSG_TYPE_MODULE = 9; // 模块相关包
    public static final int CLUSTERMSG_TYPE_COUNT = 10; // 计数边界
    private Integer type;

    private Integer count; // data中gossip section个数（供ping，pong，meet包使用）

    private Integer currentEpoch; // 发送方节点记录的集群当前纪元


    private Integer configEpoch; // 发送方节点对应的配置纪元（如果为从节点，则为该从节点所对应的主服务的配置纪元）

    private Long offset; // 如果为主，该值表示复制偏移量；如果为从，该值表示从已处理的偏移量

    private String sender; // 发送方名称 40 字节

    private Set<Integer> myslots; // 发送方提供服务的slot映射表（（如果为从，则为该所对应的主提供服务的slot映射表））

    /**
     *供节点使用的元数据
     **/
    private Map<String,String> myMetadata; // 发送方提供服务的slot映射表（（如果为从，则为该所对应的主提供服务的slot映射表））


    private String slaveof; // 发送方如果为从，则该字段为对应的主的名称


    // 发送方监听端口
    private Integer port;

    private String myip; //发送方ip

    private String notuserd1; // 预留字段

    private Integer cport; // 发送方监听的clusterbus 端口
    private Integer flags; // 发送方节点的flags

    private Integer state; // 发送方节点所记录的集群状态

    private String[] mflags; // 目前只有mflags[0]

    private String data; // 包体内容

    private List<PingNodeState> pingNodeStateList; // 携带最近几个通讯过的节点

}
